import chardet  # 用于检测文件编码
import argparse  # 解析命令行参数
import os  # 处理文件路径和系统操作


def detect_encoding(file_path):
    """
    文件编码自动转换（UTF-8←→GBK）

    运行指南：
        自动检测并转换：
            python encoding_converter.py -i 你的文件.txt
        指定转换模式：
            python encoding_converter.py -i input.txt -m gbk2utf -o output_utf8.txt
        更多帮助：
            python encoding_converter.py -h
    """
    with open(file_path, 'rb') as f:
        result = chardet.detect(f.read())  # 读取文件内容并检测编码
    return result['encoding']  # 返回检测到的编码


def convert_encoding(input_file, output_file, source_encoding, target_encoding):
    """
    转换文件编码

    参数:
        input_file: 输入文件路径
        output_file: 输出文件路径
        source_encoding: 源文件编码
        target_encoding: 目标编码
    """
    try:
        # 以源编码读取文件内容
        with open(input_file, 'r', encoding=source_encoding) as f:
            content = f.read()
        # 以目标编码写入文件
        with open(output_file, 'w', encoding=target_encoding) as f:
            f.write(content)
        print(f"成功将文件从{source_encoding}编码转换为{target_encoding}编码")
        print(f"输出文件: {output_file}")
    except UnicodeDecodeError:
        print(f"错误：无法使用{source_encoding}编码读取文件")
    except Exception as e:
        print(f"发生未知错误: {e}")


def main():
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='编码转换工具 - UTF-8与GBK互转')
    # 添加输入文件参数（必需）
    parser.add_argument('-i', '--input', required=True, help='输入文件路径')
    # 添加输出文件参数（可选）
    parser.add_argument('-o', '--output', help='输出文件路径')
    # 添加转换模式参数（可选，默认自动检测）
    parser.add_argument('-m', '--mode', choices=['utf2gbk', 'gbk2utf', 'auto'], default='auto',
                        help='转换模式：utf2gbk(UTF-8转GBK)、gbk2utf(GBK转UTF-8)、auto(自动检测)')

    args = parser.parse_args()  # 解析命令行参数

    # 检查输入文件是否存在
    if not os.path.exists(args.input):
        print(f"错误：输入文件 '{args.input}' 不存在")
        return

    # 确定输出文件路径
    if args.output:
        output_file = args.output  # 使用用户指定的输出路径
    else:
        # 自动生成输出文件名，基于输入文件名和转换模式
        base, ext = os.path.splitext(args.input)
        if args.mode == 'utf2gbk':
            output_file = f"{base}_gbk{ext}"
        elif args.mode == 'gbk2utf':
            output_file = f"{base}_utf8{ext}"
        else:  # auto
            output_file = f"{base}_converted{ext}"

    # 根据模式执行转换
    if args.mode == 'utf2gbk':
        convert_encoding(args.input, output_file, 'utf-8', 'gbk')
    elif args.mode == 'gbk2utf':
        convert_encoding(args.input, output_file, 'gbk', 'utf-8')
    else:  # auto
        detected_encoding = detect_encoding(args.input)  # 检测文件编码
        print(f"检测到文件编码: {detected_encoding}")

        # 根据检测结果执行相应转换
        if detected_encoding and 'utf-8' in detected_encoding.lower():
            convert_encoding(args.input, output_file, 'utf-8', 'gbk')
        else:
            convert_encoding(args.input, output_file, 'gbk', 'utf-8')


if __name__ == "__main__":
    main()  # 程序入口点